package com.lyy.polymorphic.object_;


/**
 * @Author: GZQ
 * @date: 2024/11/22 23:33
 * @description: toString() 方法
 */

public class ToString {
    /*
    基本介绍
    1. 默认返回：全类名+@+哈希值的十六进制，子类往往重写 toString 方法，用于返回对象的属性信息。
    2. 重写 toString 方法,打印对象或拼接对象时，都会自动调用该对象的 toString 形式。
    3. 当直接输出一个对象时,toString 方法会被默认的调用, 就会默认调用monster.toString()。
*/

    public static void main(String[] args) {

        /*
        // Object的toString() 源码
        // (1) getClass().getName() 类的全类名(包名+类名)
        // (2) Integer.toHexString(hashCode()) 将对象的hashCode值转化成16进制字符串
        public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
            */

        Monster monster = new Monster("黄鼠狼", "偷鸡", 10000);
        System.out.println(monster.toString() + " hashcode=" + monster.hashCode());

        System.out.println("==当直接输出一个对象时，toString 方法会被默认的调用==");
        System.out.println(monster); //等价 monster.toString()
    }
}

class Monster{
    private String name;
    private String job;
    private double sal;

    public Monster(String name, String job, double sal) {
        this.name = name;
        this.job = job;
        this.sal = sal;
    }

    // 重写toString方法, 输出对象的属性
    // 使用快捷键即可 alt + insert --> toString()
    @Override
    public String toString() { // 重写后, 一般是把对象的属性输出, 当然程序猿也可自己定制
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }
}
